package opgave2;

/**
 * @author Andre Baart en Jeroen Castelein
 * @elementen 
 * 		Objecten van het type E
 * @structuur
 * 		Geen
 * @domein
 * 		Het type van alle objecten in de lijst is identiek
 * 		De verzameling mag oneindig groot zijn, maar ook leeg.
 * @constructor
 * 		Verzameling();
 * 			<dl>
 * 				<dt><b>PRE-conditie</b><dd>-
 * 				<dt><b>POST-conditie</b><dd>De inhoud van het nieuwe Verzameling-object is leeg.
 * 			</dl>
 **/

public interface VerzamelingInterface<E extends Data> extends Clonable {
	
	/** Initialiseert het Verzameling object tot de lege verzameling.
     * @preconditie
     *	    -
     * @postconditie
     *	    De verzameling is leeg.
     **/
	void init ();
	
	/** Voegt een kopie van het meegegeven E object toe aan de verzameling.
     * @preconditie
     *	    -
     * @postconditie
     *	    Een kopie van het meegegeven object zit in de verzameling.
     **/
	void add (E d);
	
	/** Retourneert een kopie van een object E die op een willekeurige plek in de verzameling staat en dit object wordt uit de verzameling verwijderd.
     * @preconditie
     *	    De verzameling is niet leeg.
     * @postconditie
     *	    Een kopie van een object E op een willekeurige plek in de verzameling is geretourneerd en verwijderd.
     **/
	E take ();
	
	/** Retourneert of de verzameling leeg is.
     * @preconditie
     *	    -
     * @postconditie
     *	    True - Verzameling is leeg.
     *		False - Verzameling is niet leeg.
     **/
	boolean isEmpty ();
	
	/** Geeft het aantal objecten in de verzameling.
     * @preconditie
     *	    -
     * @postconditie
     *	    Het aantal objecten in de verzameling is geretourneerd.
     **/
	int size ();
	
	/** Retourneert of het meegegeven object E voorkomt in de verzameling.
     * @preconditie
     *	    -
     * @postconditie
     *	   	True - Het meegegeven object E komt in de verzameling voor
     *		False - Het meegegeven object E komt niet in de verzameling voor
     **/	
	boolean contains(E d);
	
	/** Retourneert een nieuwe verzameling met daarin de elementen die wel in de interne verzameling zitten maar niet in de meegegeven verzameling.
     * @preconditie
     *	    -
     * @postconditie
     *	   	Een nieuwe verzameling met daarin de elementen die wel in de interne verzameling zitten maar niet in de meegegeven verzameling is geretourneerd.
     **/
	Verzameling<E> verschil(Verzameling<E> verz2);
	
	/** Retourneert een nieuwe verzameling met daarin de elementen die in beide verzamelingen zitten.
     * @preconditie
     *	    -
     * @postconditie
     *	   	Een nieuwe verzameling met daarin de elementen die in beide verzamelingen zitten is geretourneerd.
     **/
	Verzameling<E> doorsnede(Verzameling<E> verz2);
	
	/** Retourneert een nieuwe verzameling met daarin alle elementen van beide verzamelingen.
     * @preconditie
     *	    -
     * @postconditie
     *	   	Een nieuwe verzameling met daarin alle elementen van beide verzamelingen is geretourneerd.
     **/
	Verzameling<E> vereniging(Verzameling<E> verz2);
	
	/** Retourneert een nieuwe verzameling met daarin alle elementen van beide verzamelingen die niet in de doorsnede zitten.
     * @preconditie
     *	    -
     * @postconditie
     *	   	Een nieuwe verzameling met daarin alle elementen van beide verzamelingen die niet in de doorsnede zitten is geretourneerd.
     **/
	Verzameling<E> symvers(Verzameling<E> verz2);
}
